Subject: AL
Envivo Bio, Inc.; Confidential
Figure 1 is an interactive figure showing the microbial community
composition in each collected sample. Here, each color and shade
corresponds to a different genus. For reference, domestic dogs
(Canis familiaris) and gray wolves (Canis lupus) are
different species that belong to the same genus (Canis).
You can interact with this figure by:
- Hovering the cursor over a color in the stacked bar to see the
taxonomic identity, sample type, and relative abundance corresponding to
that color and bar
- Clicking and dragging the cursor over a portion of the figure to
zoom
- Single-clicking a genus’s name in the legend to remove that genus
from the figure
- Double-clicking (very quickly) a genus’s name in the legend
to only show that genus
Figure 1: Microbial community composition of
collected saliva, stool, and CapScan samples. CapScan samples are
ordered from proximal to distal intestine (i.e.,
increasing distance from mouth). Taxonomic composition is reported at
the genus rank. Genera present at <1% relative abundance across all
samples are reported as “Other genera”. Note: Blue =
Firmicutes; Yellow = Actinomycetes; Green =
Bacteroidetes; Red = Proteobacteria; Purple = all
other phyla. Shades of the same color (except purple) correspond to
different genera from the same phylum.
Figure 2 is an interactive figure showing the microbial community
composition at higher taxononomic resolution. Here, each row corresponds
to a unique microbe.
You can interact with this figure by:
- Hovering the cursor over a cell to see that microbe’s genus and
species (and strain when available), relative abundance, and full
taxonomic classification
- Clicking and dragging the cursor over a portion of the figure to
zoom
Figure 2: Heat map showing relative abundance of
microbes in each sample (N = 266 total identified). Each row corresponds
to a unique microbe and each column corresponds to an individual sample.
Note the relative abundance colorscale is in log units.
1.3 Notable microbes detected
- Bacteroides:
- Production of proteases from a few different species linked to gut
inflammation, such as Bacteroides vulgatus (Mills et
al., 2022) and Bacteroides fragilis (Wu et al.,
2009)
- Note: Genera Bacteroides and Phocaeicola
are very closely related, with a recent reclassification of some
Bacteroides as Phocaeicola (García-López et
al., 2019). There are conflicting taxonomic assignments in this
dataset (e.g., genus identified as Phocaeicola but
strain listed under Bacteroides) – to help interpretation,
regard Bacteroides and Phocaeicola as
one genus.
1.4 References
García-López, M., Meier-Kolthoff, J.P., Tindall, B.J., Gronow, S.,
Woyke, T., Kyrpides, N.C., et al. (2019) Analysis of 1,000
Type-Strain Genomes Improves Taxonomic Classification of
Bacteroidetes. Front Microbiol 10: https://doi.org/10.3389/fmicb.2019.02083.
Mills, R.H., Dulai, P.S., Vázquez-Baeza, Y., Sauceda, C., Daniel, N.,
Gerner, R.R., et al. (2022) Multi-omics analyses of the
ulcerative colitis gut microbiome link Bacteroides vulgatus
proteases with disease severity. Nat Microbiol
7: 262–276.
Wu, S., Rhee, K.J., Albesiano, E.,
Rabizadeh, S., Wu, X., Yen, H.R., et al. (2009) A human colonic
commensal promotes colon tumorigenesis via activation of T helper type
17 T cell responses. Nat Med 15:
1016–1022.
LS0tCnRpdGxlOiAiPGJyPiBUYXhvbm9taWMgcHJvZmlsaW5nIG9mIGJhY3RlcmlhbCBhbmQgYXJjaGFlYWwgY29tbXVuaXRpZXMgZnJvbSBzYWxpdmEsIHN0b29sLCBhbmQgQ2FwU2Nhbi1zYW1wbGVkIGd1dCBtZXRhZ2Vub21lcyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCi0tLQoKPHN0eWxlPgpkaXYuaGlnaGxpZ2h0IHsKYmFja2dyb3VuZC1jb2xvcjogI0YyRjJGMjsKcGFkZGluZzogMHB4Owpib3JkZXItcmFkaXVzOiAycHg7Cn0KCjwvc3R5bGU+CgojIyMgPGI+PGk+U3ViamVjdDogQUw8L2I+PC9pPgoqRW52aXZvIEJpbywgSW5jLjsgQ29uZmlkZW50aWFsKgoKYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCmBgYHtyIGFkZCBsb2dvLCBlY2hvID0gRkFMU0V9CmxvZ29fcGF0aCA8LSAiLi4vbG9nby9lbnZpdm8uc3ZnIgoKaHRtbHRvb2xzOjppbWcoc3JjID0ga25pdHI6OmltYWdlX3VyaShsb2dvX3BhdGgpLCAKICAgICAgICAgICAgICAgYWx0ID0gImxvZ28iLCAKICAgICAgICAgICAgICAgc3R5bGUgPSAicG9zaXRpb246YWJzb2x1dGU7IHRvcDowOyByaWdodDowOyBwYWRkaW5nOjEwcHg7IHdpZHRoOiAxNDVweDsgaGVpZ2h0OiA0MnB4IikKYGBgCgpgYGB7ciBsb2FkIHBhY2thZ2VzLCBpbmNsdWRlID0gRkFMU0V9CiMgTGlzdCByZXF1aXJlZCBwYWNrYWdlcwpjcmFuUGFja2FnZXMgPC0gYygiQmlvY01hbmFnZXIiLCAiZ2dwbG90MiIsICJkcGx5ciIsICJ0aWR5ciIsCiAgICAgICAgICAgICAgICAgICJhcGUiLCAiZ2dwbG90MiIsICJyZXNoYXBlMiIsICJwbG90bHkiLCAiaGVhdG1hcGx5IikKYmlvY1BhY2thZ2VzIDwtIGMoInBoeWxvc2VxIiwgIkJpb3N0cmluZ3MiKQoKIyBJbnN0YWxsIG1pc3NpbmcgQ1JBTiBwYWNrYWdlcwppbnN0YWxsZWRDUkFOIDwtIGNyYW5QYWNrYWdlcyAlaW4lIHJvd25hbWVzKGluc3RhbGxlZC5wYWNrYWdlcygpKQppZiAoYW55KGluc3RhbGxlZENSQU4gPT0gRkFMU0UpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcyhjcmFuUGFja2FnZXNbIWluc3RhbGxlZENSQU5dLAogICAgICAgICAgICAgICAgICAgcmVwb3MgPSAnaHR0cDovL2NyYW4udXMuci1wcm9qZWN0Lm9yZycpCn0KCiMgSW5zdGFsbCBtaXNzaW5nIEJpb2NvbmR1Y3RvciBwYWNrYWdlcwppbnN0YWxsZWRCaW9jIDwtIGJpb2NQYWNrYWdlcyAlaW4lIHJvd25hbWVzKGluc3RhbGxlZC5wYWNrYWdlcygpKQppZiAoYW55KGluc3RhbGxlZEJpb2MgPT0gRkFMU0UpKSB7CiAgQmlvY01hbmFnZXI6Omluc3RhbGwoYmlvY1BhY2thZ2VzWyFpbnN0YWxsZWRCaW9jXSkKfQoKIyBMb2FkIHBhY2thZ2VzCmxhcHBseShjKGNyYW5QYWNrYWdlcywgYmlvY1BhY2thZ2VzKSwgbGlicmFyeSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQpgYGAKCmBgYHtyIGxvYWQgZGF0YSwgaW5jbHVkZSA9IEZBTFNFfQojIExvYWQgQ29zbW9zSUQgZGF0YSBhbmQgZm9ybWF0dGVkIG1ldGFkYXRhCmNvc21vcyA8LSByZWFkLmNzdihmaWxlID0gIi4uL2RhdGEvQ1AwNDYxOF9mb2xsb3dfdXBfMjAyMjA5MjAuY3N2IikKbWV0YSA8LSByZWFkLmNzdihmaWxlID0gIi4uL2RhdGEvQ1AwNDYxOF9mb2xsb3dfdXBfbWV0YWRhdGEuY3N2IikKYGBgCgpgYGB7ciBmb3JtYXQgZGF0YSwgaW5jbHVkZSA9IEZBTFNFfQojIFByZXBhcmUgdGF4X3RhYmxlIGFuZCBvdHVfdGFibGUgb2JqZWN0cwp0YXggPC0gY29zbW9zICU+JQogIHNlbGVjdChQaHlsdW0sIENsYXNzLCBPcmRlciwgRmFtaWx5LCBHZW51cywgU3BlY2llcywgU3RyYWluKSAlPiUKICBhcy5tYXRyaXggJT4lCiAgdGF4X3RhYmxlCgpzdGFydF9pbmQgPC0gZ3JlcCgiU3RyYWluIiwgY29sbmFtZXMoY29zbW9zKSkrMQpzdG9wX2luZCA8LSBuY29sKGNvc21vcyktMgphYnVuZGFuY2Vfc2NvcmVzIDwtIGNvc21vc1ssc3RhcnRfaW5kOnN0b3BfaW5kXSAlPiUgb3R1X3RhYmxlKC4sIHRheGFfYXJlX3Jvd3MgPSBUUlVFKQoKIyBSZWZvcm1hdCBzYW1wbGUgbmFtZXMgYW5kIG1ldGFkYXRhIHNhbXBsZSBuYW1lcyBzbyB0aGV5IG1hdGNoCmNvbG5hbWVzKGFidW5kYW5jZV9zY29yZXMpIDwtIGNvbG5hbWVzKGFidW5kYW5jZV9zY29yZXMpICU+JQogIGdzdWIoIlgiLCAiIiwgLikgJT4lCiAgZ3N1YigiXy4qIiwgIiIsIC4pICU+JQogIHBhc3RlMCgiRUJfIiwgLikKCnJvdy5uYW1lcyhtZXRhKSA8LSBtZXRhICU+JQogIHB1bGwoU2FtcGxlX251bWJlcikgJT4lCiAgcGFzdGUwKCJFQl8iLCAuKQoKc2FtX2RhdGEgPC0gc2FtcGxlX2RhdGEobWV0YSkKYGBgCgpgYGB7ciBidWlsZCBwaHlsb3NlcSwgaW5jbHVkZSA9IEZBTFNFfQojIEJ1aWxkIHBoeWxvc2VxIG9iamVjdApwcyA8LSBwaHlsb3NlcSh0YXgsIGFidW5kYW5jZV9zY29yZXMsIHNhbV9kYXRhKQpgYGAKCmBgYHtyIHRyYW5zZm9ybSBkYXRhLCBpbmNsdWRlID0gRkFMU0V9CiMgTG9nIHRyYW5zZm9ybQpwc0xvZyA8LSBwcyAlPiUgdHJhbnNmb3JtX3NhbXBsZV9jb3VudHMoLiwgZnVuY3Rpb24oeCkgbG9nKHggKyAxLCBiYXNlID0gMTApKQoKIyBSZWxhdGl2ZSBhYnVuZGFuY2UgdHJhbnNmb3JtCnBzUkEgPC0gcHMgJT4lIHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKC4sIGZ1bmN0aW9uKHgpIHgvc3VtKHgpKjEwMCkKYGBgCgpgYGB7ciByYW5rIHBoeWxhLCBpbmNsdWRlID0gRkFMU0V9CnBoeV9yYW5rIDwtIHBzUkEgJT4lCiAgdGF4X2dsb20oLiwgdGF4cmFuayA9ICJQaHlsdW0iKSAlPiUKICBwc21lbHQgJT4lCiAgZ3JvdXBfYnkoUGh5bHVtKSAlPiUKICBzdW1tYXJpc2UobWVkaWFuID0gbWVkaWFuKEFidW5kYW5jZSkpCgpwaHlfcmFuayAlPiUgYXJyYW5nZShkZXNjKG1lZGlhbikpCmBgYAoKYGBge3Igc3ViamVjdCBzdWJzZXQsIGluY2x1ZGUgPSBGQUxTRX0KIyBTZXQgc3ViamVjdApzdWJqZWN0IDwtICJBTCIKCiMgU3Vic2V0IHRvIHN1YmplY3Qgc2FtcGxlcyBhbmQgZHJvcCBtaXNzaW5nIHRheGEKcHNTdWIgPC0gc3Vic2V0X3NhbXBsZXMocHMsIFN1YmplY3QgPT0gc3ViamVjdCkgJT4lCiAgcHJ1bmVfdGF4YSh0YXhhX3N1bXMoLikgPiAwLCAuKQoKIyBBZGQgcGxvdCBsYWJlbCBmb3IgZWFjaCBzYW1wbGUKc2FtcGxlX2RhdGEocHNTdWIpJFBsb3RfbGFiZWwgPC0gcGFzdGUwKHNhbXBsZV9uYW1lcyhwc1N1YiksICIgKCIsIHNhbXBsZV9kYXRhKHBzU3ViKSRTYW1wbGVfdHlwZSwgIikiKQoKIyBSZWxhdGl2ZSBhYnVuZGFuY2UgdHJhbnNmb3JtCnBzU3ViX3JhIDwtIHBzU3ViICU+JSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyguLCBmdW5jdGlvbih4KSB4L3N1bSh4KSoxMDApCmBgYAoKYGBge3IgcGxvdCBiYXIsIGluY2x1ZGUgPSBGQUxTRX0KIyBEZWZpbmUgTk9UIElOIG9wZXJhdG9yCiclIWluJScgPC0gZnVuY3Rpb24oeCx5KSEoJyVpbiUnKHgseSkpCgojIEFnZ2xvbWVyYXRlIGF0IEdlbnVzIGFuZCBtZWx0CnRheHJhbmsgPC0gIkdlbnVzIgptZWx0IDwtIHBzU3ViX3JhICU+JSB0YXhfZ2xvbSguLCB0YXhyYW5rID0gdGF4cmFuaykgJT4lIHBzbWVsdAoKIyBEZWZpbmUgbWFqb3IgcGh5bGEKbWFqb3JfcGh5IDwtIGMoIkZpcm1pY3V0ZXMiLCAiQWN0aW5vYmFjdGVyaWEiLCAiQmFjdGVyb2lkZXRlcyIsICJQcm90ZW9iYWN0ZXJpYSIpCgojIElkZW50aWZ5IGdlbmVyYSBwcmVzZW50IGluIDwxJSByZWxhdGl2ZSBhYnVuZGFuY2UgaW4gYWxsIHNhbXBsZXMKcmFyZV9nZW5lcmEgPC0gbWVsdCAlPiUKICBncm91cF9ieShTYW1wbGVfbnVtYmVyLCBHZW51cykgJT4lCiAgc3VtbWFyaXplKHN1bSA9IHN1bShBYnVuZGFuY2UpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoR2VudXMpICU+JQogIHN1bW1hcml6ZShtYXggPSBtYXgoc3VtKSkgJT4lCiAgZmlsdGVyKG1heCA8IDEpICU+JQogIHB1bGwoR2VudXMpCgojIENyZWF0ZSBuZXcgY29sdW1uIGNvbnRhaW5pbmcgbmFtZSBvZiBnZW51cyBpZiBhYm92ZSBjdXRvZmYgb3IgIk90aGVyIGdlbmVyYSIgaWYgbm90CmRmIDwtIG1lbHQgJT4lCiAgbXV0YXRlKFBoeV9ncm91cCA9IGNhc2Vfd2hlbihQaHlsdW0gJSFpbiUgbWFqb3JfcGh5IH4gIk90aGVyIHBoeWx1bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gUGh5bHVtKSwKICAgICAgICAgUGh5X2dyb3VwID0gY2FzZV93aGVuKEdlbnVzICVpbiUgcmFyZV9nZW5lcmEgfiAiT3RoZXIgcGh5bHVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBQaHlfZ3JvdXApLAogICAgICAgICBUYXhfbGFiZWwgPSBjYXNlX3doZW4oR2VudXMgJWluJSByYXJlX2dlbmVyYSB+ICJBYU90aGVyIGdlbmVyYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gR2VudXMpKSAlPiUKICBncm91cF9ieShTdWJqZWN0KSAlPiUKICBhcnJhbmdlKFN1YmplY3QsIFNhbXBsZV90eXBlKQoKIyBEZWZpbmUgb3JkZXIKcGh5X29yZGVyIDwtIGMoIk90aGVyIHBoeWx1bSIsCiAgICAgICAgICAgICAgICJQcm90ZW9iYWN0ZXJpYSIsCiAgICAgICAgICAgICAgICJCYWN0ZXJvaWRldGVzIiwKICAgICAgICAgICAgICAgIkFjdGlub2JhY3RlcmlhIiwKICAgICAgICAgICAgICAgIkZpcm1pY3V0ZXMiKSAlPiUgcmV2CgpnZW5fb3JkZXIgPC0gZGYgJT4lCiAgc2VsZWN0KFBoeV9ncm91cCwgVGF4X2xhYmVsKSAlPiUKICBtdXRhdGUoT3JkZXIgPSBtYXRjaChQaHlfZ3JvdXAsIHBoeV9vcmRlcikpICU+JQogIGFycmFuZ2UoT3JkZXIsIGRlc2MoVGF4X2xhYmVsKSkgJT4lCiAgZGlzdGluY3QgJT4lCiAgcHVsbChUYXhfbGFiZWwpCgpnZW5fb3JkZXIgPC0gZmFjdG9yKGdzdWIoIl5BYSIsICIiLCBnZW5fb3JkZXIpLCBsZXZlbHMgPSBnc3ViKCJeQWEiLCAiIiwgZ2VuX29yZGVyKSkgIyB0aGUgQWEgaXMgdG8gbWFrZSBzdXJlICJPdGhlciIgaXMgcGxvdHRlZCBhdCB0aGUgdG9wCgpkZiA8LSBkZiAlPiUKICBtdXRhdGUoVGF4X2xhYmVsID0gZmFjdG9yKGdzdWIoIl5BYSIsICIiLCBUYXhfbGFiZWwpLCBsZXZlbHMgPSBnZW5fb3JkZXIpKQoKIyBEZWZpbmUgY29sb3JzCnBoeV9jb2xvciA8LSBkYXRhLmZyYW1lKFBoeWx1bSA9IGMoIkFjdGlub2JhY3RlcmlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIgcGh5bHVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFjdGVyb2lkZXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpcm1pY3V0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm90ZW9iYWN0ZXJpYSIpLAogICAgICAgICAgICAgICAgICAgICAgICBCYXNlX2NvbG9yID0gYygiI0ZGQjcyNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjODMyQ0ZGIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM2NEM2MkEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzA3MkFDOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRTkzQjRGIikpCgpwaHlfY29sb3IgPC0gcGh5X2NvbG9yW21hdGNoKHBoeV9vcmRlciwgcGh5X2NvbG9yJFBoeWx1bSksXQoKIyBEYXRhIGZyYW1lIGFzIGlucHV0LCBkYXRhIGZyYW1lIHdpdGggbmV3IGNvbHVtbiBvZiBoZXggY29kZXMgYXMgb3V0cHV0CmNvbF9wYWxldHRlIDwtIGRmICU+JQogIHNlbGVjdChQaHlfZ3JvdXAsIFRheF9sYWJlbCkgJT4lCiAgZGlzdGluY3QgJT4lCiAgbXV0YXRlKEhleF9jb2RlID0gTkEpCgoKZm9yKHBoeSBpbiBwaHlfY29sb3IkUGh5bHVtKSB7CiAgdGVzdCA8LSBjb2xfcGFsZXR0ZSAlPiUKICAgIGZpbHRlcihQaHlfZ3JvdXAgPT0gcGh5KSAlPiUKICAgIHB1bGwoVGF4X2xhYmVsKSAlPiUKICAgIGRyb3BsZXZlbHMgJT4lCiAgICBsZXZlbHMKICAKICB0YXguY29sb3IgPC0gY29sb3JSYW1wUGFsZXR0ZShjKHBoeV9jb2xvciRCYXNlX2NvbG9yW21hdGNoKHBoeSwgcGh5X2NvbG9yJFBoeWx1bSldLCAid2hpdGUiKSkKICBjb2x0ZXN0IDwtIHRheC5jb2xvcihsZW5ndGgodGVzdCkrMikgJT4lCiAgICAuWy1sZW5ndGgoLildCiAgY29sX3BhbGV0dGUkSGV4X2NvZGVbbWF0Y2godGVzdCwgY29sX3BhbGV0dGUkVGF4X2xhYmVsKV0gPC0gY29sdGVzdAp9Cgpjb2xfcGFsZXR0ZSA8LSBjb2xfcGFsZXR0ZSAlPiUgYXJyYW5nZShmYWN0b3IoVGF4X2xhYmVsLCBsZXZlbHMgPSBnZW5fb3JkZXIpKQpgYGAKCjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+CiMjIyAxLjEgT3ZlcnZpZXcgb2YgbWljcm9iaWFsIGNvbW11bml0eSBjb21wb3NpdGlvbgo8L2Rpdj4KCkZpZ3VyZSAxIGlzIGFuIGludGVyYWN0aXZlIGZpZ3VyZSBzaG93aW5nIHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5IGNvbXBvc2l0aW9uIGluIGVhY2ggY29sbGVjdGVkIHNhbXBsZS4gSGVyZSwgZWFjaCBjb2xvciBhbmQgc2hhZGUgY29ycmVzcG9uZHMgdG8gYSBkaWZmZXJlbnQgZ2VudXMuIEZvciByZWZlcmVuY2UsIGRvbWVzdGljIGRvZ3MgKCpDYW5pcyBmYW1pbGlhcmlzKikgYW5kIGdyYXkgd29sdmVzICgqQ2FuaXMgbHVwdXMqKSBhcmUgZGlmZmVyZW50IHNwZWNpZXMgdGhhdCBiZWxvbmcgdG8gdGhlIHNhbWUgZ2VudXMgKCpDYW5pcyopLgo8YnI+PGJyPgpZb3UgY2FuIGludGVyYWN0IHdpdGggdGhpcyBmaWd1cmUgYnk6CgoqIEhvdmVyaW5nIHRoZSBjdXJzb3Igb3ZlciBhIGNvbG9yIGluIHRoZSBzdGFja2VkIGJhciB0byBzZWUgdGhlIHRheG9ub21pYyBpZGVudGl0eSwgc2FtcGxlIHR5cGUsIGFuZCByZWxhdGl2ZSBhYnVuZGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGF0IGNvbG9yIGFuZCBiYXIKKiBDbGlja2luZyBhbmQgZHJhZ2dpbmcgdGhlIGN1cnNvciBvdmVyIGEgcG9ydGlvbiBvZiB0aGUgZmlndXJlIHRvIHpvb20KKiBTaW5nbGUtY2xpY2tpbmcgYSBnZW51cydzIG5hbWUgaW4gdGhlIGxlZ2VuZCB0byByZW1vdmUgdGhhdCBnZW51cyBmcm9tIHRoZSBmaWd1cmUKKiBEb3VibGUtY2xpY2tpbmcgKDx1PnZlcnkgcXVpY2tseTwvdT4pIGEgZ2VudXMncyBuYW1lIGluIHRoZSBsZWdlbmQgdG8gb25seSBzaG93IHRoYXQgZ2VudXMKYGBge3IsIG91dC53aWR0aCA9ICIxMDAlIiwgZWNobyA9IEZBTFNFfQojIFBsb3QKcEJhciA8LSBwbG90X2x5KGRmLCB4ID0gflBsb3RfbGFiZWwsIHkgPSB+QWJ1bmRhbmNlLCB0eXBlID0gImJhciIsCiAgICAgICAgICAgICBjb2xvciA9IH5UYXhfbGFiZWwsIGNvbG9ycyA9IGNvbF9wYWxldHRlJEhleF9jb2RlLAogICAgICAgICAgICAgdGV4dHBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgiPGI+R2VudXM6PC9iPiIsIFRheF9sYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj48YnI+IiwgIjxiPlNhbXBsZSB0eXBlOjwvYj4iLCBTYW1wbGVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCAiPGI+UmVsYXRpdmUgYWJ1bmRhbmNlOjwvYj4iLCBwYXN0ZTAocm91bmQoQWJ1bmRhbmNlLCBkaWdpdHMgPSAxKSwgIiUiKSksCiAgICAgICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIpICU+JQogIGxheW91dCh4YXhpcyA9IGxpc3QodGl0bGUgPSAiPGI+U2FtcGxlPC9iPiIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9ICJvdXRzaWRlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICI8Yj5SZWxhdGl2ZSBhYnVuZGFuY2UgKCUpPC9iPiIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9ICJvdXRzaWRlIiksCiAgICAgICAgIGJhcm1vZGUgPSAic3RhY2siLAogICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiQXJpYWwiKSkKCnBCYXIkeCRsYXlvdXQkeWF4aXMkbGluZWNvbG9yIDwtICIjMDAwMDAwIgpwQmFyCmBgYAoqKkZpZ3VyZSAxOioqIE1pY3JvYmlhbCBjb21tdW5pdHkgY29tcG9zaXRpb24gb2YgY29sbGVjdGVkIHNhbGl2YSwgc3Rvb2wsIGFuZCBDYXBTY2FuIHNhbXBsZXMuIENhcFNjYW4gc2FtcGxlcyBhcmUgb3JkZXJlZCBmcm9tIHByb3hpbWFsIHRvIGRpc3RhbCBpbnRlc3RpbmUgKCppKi4qZSouLCBpbmNyZWFzaW5nIGRpc3RhbmNlIGZyb20gbW91dGgpLiBUYXhvbm9taWMgY29tcG9zaXRpb24gaXMgcmVwb3J0ZWQgYXQgdGhlIGdlbnVzIHJhbmsuIEdlbmVyYSBwcmVzZW50IGF0IDwxJSByZWxhdGl2ZSBhYnVuZGFuY2UgYWNyb3NzIGFsbCBzYW1wbGVzIGFyZSByZXBvcnRlZCBhcyAiT3RoZXIgZ2VuZXJhIi4gPHU+Tm90ZTo8L3U+IEJsdWUgPSAqRmlybWljdXRlcyo7IFllbGxvdyA9ICpBY3Rpbm9teWNldGVzKjsgR3JlZW4gPSAqQmFjdGVyb2lkZXRlcyo7IFJlZCA9ICpQcm90ZW9iYWN0ZXJpYSo7IFB1cnBsZSA9IGFsbCBvdGhlciBwaHlsYS4gU2hhZGVzIG9mIHRoZSBzYW1lIGNvbG9yIChleGNlcHQgcHVycGxlKSBjb3JyZXNwb25kIHRvIGRpZmZlcmVudCBnZW5lcmEgZnJvbSB0aGUgc2FtZSBwaHlsdW0uCgpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQojIE9yZGluYXRpb24tYmFzZWQKcEhlYXRfb3JkIDwtIHBsb3RfaGVhdG1hcChwc1N1Yl9yYSwgbWV0aG9kID0gIk5NRFMiLCBkaXN0YW5jZSA9ICJicmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICB0YXhhLmxhYmVsID0gIlN0cmFpbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4LmxhYmVsID0gMzAwKQoKIyBSZXRyaWV2ZSByb3cgYW5kIHRheG9uIG9yZGVycwpyb3dfb3JkZXIgPC0gcEhlYXRfb3JkJHBsb3RfZW52JHRheGEub3JkZXIgJT4lIHJldgp0YXhfb3JkZXIgPC0gdGF4X3RhYmxlKHBzU3ViX3JhKVttYXRjaChyb3dfb3JkZXIsIHJvd25hbWVzKHRheF90YWJsZShwc1N1Yl9yYSkpKSxdICU+JQogIGFzLmRhdGEuZnJhbWUgJT4lCiAgbXV0YXRlKHRheG9uID0gcm93bmFtZXMoLiksCiAgICAgICAgIEFidW5kYW5jZSA9IDEsCiAgICAgICAgIFNhbXBsZSA9IHN1YmplY3QpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0KIyBQcmVwYXJlIGRhdGEKeCA8LSBwc1N1Yl9yYSAlPiUgb3R1X3RhYmxlICU+JSBhcy5kYXRhLmZyYW1lCmNvbG5hbWVzKHgpIDwtIGxhcHBseShjb2xuYW1lcyh4KSwgZ3JlcCwgc2FtcGxlX2RhdGEocHNTdWJfcmEpJFBsb3RfbGFiZWwsIHZhbHVlID0gVFJVRSkgJT4lIHVubGlzdAoKIyBBZGQgdGF4b25vbXkKeCA8LSBjYmluZCh4LCB0YXhfdGFibGUocHNTdWJfcmEpKQoKIyBSZW9yZGVyIHJvd3MgYW5kIGNvbHVtbnMgdG8gbWF0Y2ggb3JkaW5hdGlvbgp4IDwtIHhbbWF0Y2gocm93X29yZGVyLCByb3duYW1lcyh4KSksXQoKIyBTZXQgaG92ZXJ0ZXh0Cm5zYW1wIDwtIG5zYW1wbGVzKHBzU3ViX3JhKQpob3Zlcl9zdHJhaW4gPC0geFssIDE6bnNhbXBdCmhvdmVyX3N0cmFpbltdIDwtIHBhc3RlMCgiPGI+TWljcm9iZTo8L2I+ICIsIHgkU3RyYWluLCAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIjxiPlJlbGF0aXZlIGFidW5kYW5jZTo8L2I+ICIpCmhvdmVyX3N0cmFpbiA8LSBhcy5tYXRyaXgoaG92ZXJfc3RyYWluKQoKaG92ZXJfYWJ1bmQgPC0geFssIDE6bnNhbXBdICU+JSByb3VuZCguLCBkaWdpdHMgPSAyKSAlPiUgYXMuZGF0YS5mcmFtZQpob3Zlcl9hYnVuZCA8LSBhcHBseShob3Zlcl9hYnVuZCwgMiwgcGFzdGUwLCAiJSIpCmhvdmVyX2FidW5kIDwtIGFzLm1hdHJpeChob3Zlcl9hYnVuZCkKCmhvdmVyX3RheCA8LSB4WywgMTpuc2FtcF0KaG92ZXJfdGF4W10gPC0gcGFzdGUwKCJcbiBcbjxiPlBoeWx1bTo8L2I+ICIsIHgkUGh5bHVtLCAiXG4iLAogICAgICAgICAgICAgICAgICAgIjxiPkNsYXNzOjwvYj4gIiwgeCRDbGFzcywgIlxuIiwKICAgICAgICAgICAgICAgICAgICI8Yj5PcmRlcjo8L2I+ICIsIHgkT3JkZXIsICJcbiIsCiAgICAgICAgICAgICAgICAgICAiPGI+RmFtaWx5OjwvYj4gIiwgeCRGYW1pbHksICJcbiIsCiAgICAgICAgICAgICAgICAgICAiPGI+R2VudXM6PC9iPiAiLCB4JEdlbnVzLCAiXG4iKQpob3Zlcl90YXggPC0gYXMubWF0cml4KGhvdmVyX3RheCkKCmhvdmVydGV4dCA8LSBtYXRyaXgocGFzdGUwKGhvdmVyX3N0cmFpbiwgaG92ZXJfYWJ1bmQsIGhvdmVyX3RheCksCiAgICAgICAgICAgICAgICBucm93ID0gbnJvdyhob3Zlcl90YXgpLCBuY29sID0gbmNvbChob3Zlcl90YXgpKQoKIyBQZXJmb3JtIGxvZzEwIHRyYW5zZm9ybWF0aW9uIG9uIHJlbGF0aXZlIGFidW5kYW5jZXMKZGF0YSA8LSBsb2coeFssIDE6bnNhbXBdLCBiYXNlID0gMTApCmRhdGFbc2FwcGx5KGRhdGEsIGlzLmluZmluaXRlKV0gPC0gTkEKYGBgCjxicj48YnI+Cgo8ZGl2IGNsYXNzPSJoaWdobGlnaHQiPgojIyMgMS4yIEhpZ2gtcmVzb2x1dGlvbiBzbmFwc2hvdCBvZiBjb21tdW5pdHkgY29tcG9zaXRpb24KPC9kaXY+CkZpZ3VyZSAyIGlzIGFuIGludGVyYWN0aXZlIGZpZ3VyZSBzaG93aW5nIHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5IGNvbXBvc2l0aW9uIGF0IGhpZ2hlciB0YXhvbm9ub21pYyByZXNvbHV0aW9uLiBIZXJlLCBlYWNoIHJvdyBjb3JyZXNwb25kcyB0byBhIHVuaXF1ZSBtaWNyb2JlLgo8YnI+PGJyPgpZb3UgY2FuIGludGVyYWN0IHdpdGggdGhpcyBmaWd1cmUgYnk6CgoqIEhvdmVyaW5nIHRoZSBjdXJzb3Igb3ZlciBhIGNlbGwgdG8gc2VlIHRoYXQgbWljcm9iZSdzIGdlbnVzIGFuZCBzcGVjaWVzIChhbmQgc3RyYWluIHdoZW4gYXZhaWxhYmxlKSwgcmVsYXRpdmUgYWJ1bmRhbmNlLCBhbmQgZnVsbCB0YXhvbm9taWMgY2xhc3NpZmljYXRpb24KKiBDbGlja2luZyBhbmQgZHJhZ2dpbmcgdGhlIGN1cnNvciBvdmVyIGEgcG9ydGlvbiBvZiB0aGUgZmlndXJlIHRvIHpvb20KCjxicj48YnI+CmBgYHtyLCBvdXQuaGVpZ2h0ID0gIjc1MHB4IiwgZWNobyA9IEZBTFNFfQojIFNldCBzYW1wbGUgbmFtZXMKI2NvbG5hbWVzKGRhdGEpIDwtIGMoIkVCXzI2OSAoc2FsaXZhKSIsICJFQl8yNzAgKENhcFNjYW4pIiwgIkVCXzI3MSAoQ2FwU2NhbikiLAojICAgICAgICAgICAgICAgICAgICAiRUJfMjcyIChDYXBTY2FuKSIsICJFQl8yNzMgKENhcFNjYW4pIiwgIkVCXzI3NCAoc3Rvb2wpIikKCiMgUHJlcGFyZSB0YXhvbm9teSByb3cgc2lkZQpyb3dfc2lkZSA8LSB4ICU+JSBzZWxlY3QoUGh5bHVtKQpyb3dfc2lkZSRQaHlsdW1bcm93X3NpZGUkUGh5bHVtICUhaW4lIG1ham9yX3BoeV0gPC0gIk90aGVyIHBoeWxhIgpyb3dfc2lkZSRQaHlsdW0gPC0gZmFjdG9yKHJvd19zaWRlJFBoeWx1bSwgbGV2ZWxzID0gYygiT3RoZXIgcGh5bGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdGVvYmFjdGVyaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFjdGVyb2lkZXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpbm9iYWN0ZXJpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaXJtaWN1dGVzIikpCgojIFBsb3QKcEhlYXQgPC0gaGVhdG1hcGx5KGRhdGEsCiAgICAgICAgICAgICAgICAgICBSb3d2ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBDb2x2ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBjb2xvcnMgPSB2aXJpZGlzOjp2aXJpZGlzKDEwKSwKICAgICAgICAgICAgICAgICAgIHJvd19zaWRlX2NvbG9ycyA9IHJvd19zaWRlLAogICAgICAgICAgICAgICAgICAgcm93X3NpZGVfcGFsZXR0ZSA9IGMoIkFjdGlub2JhY3RlcmlhIiA9ICIjRkZCNzI0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWN0ZXJvaWRldGVzIiA9ICIjNjRDNjJBIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaXJtaWN1dGVzIiA9ICIjMDcyQUM4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm90ZW9iYWN0ZXJpYSIgPSAiI0U5M0I0RiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIgcGh5bGEiID0gIiM4MzJDRkYiKSwKICAgICAgICAgICAgICAgICAgIHN1YnBsb3RfbWFyZ2luID0gMC4wMSwKICAgICAgICAgICAgICAgICAgIHN1YnBsb3Rfd2lkdGhzID0gYygwLjksIDAuMDcpLAogICAgICAgICAgICAgICAgICAgc2lkZV9jb2xvcl9jb2xvcmJhcl9sZW4gPSAwLjMsCiAgICAgICAgICAgICAgICAgICBwbG90X21ldGhvZCA9ICJwbG90bHkiLAogICAgICAgICAgICAgICAgICAgY3VzdG9tX2hvdmVydGV4dCA9IGhvdmVydGV4dCwKICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiPGI+U2FtcGxlPC9iPiIsCiAgICAgICAgICAgICAgICAgICB5bGFiID0gIjxiPk1pY3JvYmU8L2I+IiwKICAgICAgICAgICAgICAgICAgIGNvbG9yYmFyX3hwb3MgPSAxLjAxOSwKICAgICAgICAgICAgICAgICAgIGNvbG9yYmFyX3lwb3MgPSAwLjUsCiAgICAgICAgICAgICAgICAgICBjb2xvcmJhcl9sZW4gPSAwLjMpICU+JQogIGxheW91dCh4YXhpcyA9IGxpc3Qoc2hvd2dyaWQgPSBGQUxTRSksCiAgICAgICAgIHlheGlzID0gbGlzdChzaG93Z3JpZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJBcmlhbCIpKSAlPiUKICBjb2xvcmJhcih0aXRsZSA9ICJSZWxhdGl2ZSBhYnVuZGFuY2UiLAogICAgICAgICAgIHRpY2t2YWxzID0gYygtMSwgMCwgMSksCiAgICAgICAgICAgdGlja3RleHQgPSBjKCIwLjElIiwgIjElIiwgIjEwJSIpKQoKIyBGb3JtYXQgcm93IHNpZGUKcEhlYXQkeCRsYXlvdXQkeGF4aXMyJHRpY2t0ZXh0IDwtICJQaHlsdW0iCnBIZWF0JHgkbGF5b3V0JHhheGlzJGxpbmVjb2xvciA8LSAiIzAwMDAwMCIKcEhlYXQkeCRsYXlvdXQkeGF4aXMyJGxpbmVjb2xvciA8LSAiIzAwMDAwMCIKcEhlYXQkeCRsYXlvdXQkeWF4aXMkbGluZWNvbG9yIDwtICIjMDAwMDAwIgpwSGVhdCR4JGxheW91dCRsZWdlbmQkeWFuY2hvciA8LSAiYm90dG9tIgpwSGVhdApgYGAKKipGaWd1cmUgMjoqKiBIZWF0IG1hcCBzaG93aW5nIHJlbGF0aXZlIGFidW5kYW5jZSBvZiBtaWNyb2JlcyBpbiBlYWNoIHNhbXBsZSAoTiA9IDI2NiB0b3RhbCBpZGVudGlmaWVkKS4gRWFjaCByb3cgY29ycmVzcG9uZHMgdG8gYSB1bmlxdWUgbWljcm9iZSBhbmQgZWFjaCBjb2x1bW4gY29ycmVzcG9uZHMgdG8gYW4gaW5kaXZpZHVhbCBzYW1wbGUuIE5vdGUgdGhlIHJlbGF0aXZlIGFidW5kYW5jZSBjb2xvcnNjYWxlIGlzIGluIGxvZyB1bml0cy4KCjxicj48YnI+Cgo8ZGl2IGNsYXNzPSJoaWdobGlnaHQiPgojIyMgMS4zIE5vdGFibGUgbWljcm9iZXMgZGV0ZWN0ZWQKPC9kaXY+CgoqICpCYWN0ZXJvaWRlcyo6CiAgKiBQcm9kdWN0aW9uIG9mIHByb3RlYXNlcyBmcm9tIGEgZmV3IGRpZmZlcmVudCBzcGVjaWVzIGxpbmtlZCB0byBndXQgaW5mbGFtbWF0aW9uLCBzdWNoIGFzICpCYWN0ZXJvaWRlcyB2dWxnYXR1cyogKE1pbGxzICpldCBhbCouLCAyMDIyKSBhbmQgKkJhY3Rlcm9pZGVzIGZyYWdpbGlzKiAoV3UgKmV0IGFsKi4sIDIwMDkpCiAgKiA8dT5Ob3RlOjwvdT4gR2VuZXJhICpCYWN0ZXJvaWRlcyogYW5kICpQaG9jYWVpY29sYSogYXJlIHZlcnkgY2xvc2VseSByZWxhdGVkLCB3aXRoIGEgcmVjZW50IHJlY2xhc3NpZmljYXRpb24gb2Ygc29tZSAqQmFjdGVyb2lkZXMqIGFzICpQaG9jYWVpY29sYSogKEdhcmPDrWEtTMOzcGV6ICpldCBhbCouLCAyMDE5KS4gVGhlcmUgYXJlIGNvbmZsaWN0aW5nIHRheG9ub21pYyBhc3NpZ25tZW50cyBpbiB0aGlzIGRhdGFzZXQgKCplLmcuKiwgZ2VudXMgaWRlbnRpZmllZCBhcyAqUGhvY2FlaWNvbGEqIGJ1dCBzdHJhaW4gbGlzdGVkIHVuZGVyICpCYWN0ZXJvaWRlcyopIC0tIHRvIGhlbHAgaW50ZXJwcmV0YXRpb24sIHJlZ2FyZCAqQmFjdGVyb2lkZXMqIGFuZCAqUGhvY2FlaWNvbGEqIGFzICoqb25lKiogZ2VudXMuCjxicj48YnI+CgoKPGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij4KIyMjIDEuNCBSZWZlcmVuY2VzCjwvZGl2PgoKR2FyY8OtYS1Mw7NwZXosIE0uLCBNZWllci1Lb2x0aG9mZiwgSi5QLiwgVGluZGFsbCwgQi5KLiwgR3Jvbm93LCBTLiwgV295a2UsIFQuLCBLeXJwaWRlcywgTi5DLiwgKmV0IGFsKi4gKDIwMTkpIEFuYWx5c2lzIG9mIDEsMDAwIFR5cGUtU3RyYWluIEdlbm9tZXMgSW1wcm92ZXMgVGF4b25vbWljIENsYXNzaWZpY2F0aW9uIG9mICpCYWN0ZXJvaWRldGVzKi4gKkZyb250IE1pY3JvYmlvbCogKioxMDoqKiBodHRwczovL2RvaS5vcmcvMTAuMzM4OS9mbWljYi4yMDE5LjAyMDgzLgo8YnI+PGJyPgpNaWxscywgUi5ILiwgRHVsYWksIFAuUy4sIFbDoXpxdWV6LUJhZXphLCBZLiwgU2F1Y2VkYSwgQy4sIERhbmllbCwgTi4sIEdlcm5lciwgUi5SLiwgKmV0IGFsKi4gKDIwMjIpIE11bHRpLW9taWNzIGFuYWx5c2VzIG9mIHRoZSB1bGNlcmF0aXZlIGNvbGl0aXMgZ3V0IG1pY3JvYmlvbWUgbGluayAqQmFjdGVyb2lkZXMgdnVsZ2F0dXMqIHByb3RlYXNlcyB3aXRoIGRpc2Vhc2Ugc2V2ZXJpdHkuICpOYXQgTWljcm9iaW9sKiAqKjc6KiogMjYy4oCTMjc2Lgo8YnI+PGJyPgpXdSwgUy4sIFJoZWUsIEsuSi4sIEFsYmVzaWFubywgRS4sIFJhYml6YWRlaCwgUy4sIFd1LCBYLiwgWWVuLCBILlIuLCAqZXQgYWwqLiAoMjAwOSkgQSBodW1hbiBjb2xvbmljIGNvbW1lbnNhbCBwcm9tb3RlcyBjb2xvbiB0dW1vcmlnZW5lc2lzIHZpYSBhY3RpdmF0aW9uIG9mIFQgaGVscGVyIHR5cGUgMTcgVCBjZWxsIHJlc3BvbnNlcy4gKk5hdCBNZWQqICoqMTU6KiogMTAxNuKAkzEwMjIu